//
//  CoreDataStack.h
//  SYCoreDataProject
//
//  Created by gambler. on 2019/4/22.
//  Copyright © 2019 gambler. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
NS_ASSUME_NONNULL_BEGIN

@interface CoreDataStack : NSObject


/**
 一个容器,封装了应用程序中的CoreData Stack（核心数据栈堆）
 */
@property (readonly, strong) NSPersistentContainer *persistentContainer;


/**
 * 上下文  容器
 * 存放的是 所有从数据库中取出的转换成OC对象
 */
@property(nonatomic,strong)NSManagedObjectContext *managedObjectContext;


/* 读取解析 .momd文件中的内容 */
@property(nonatomic,strong)NSManagedObjectModel *managedObjectModel;



/* 连接的类，处理数据库数据和OC数据底层的相互转换 */
@property(nonatomic,strong)NSPersistentStoreCoordinator *persistentStoreCoordinator;

/**
 单例
 */
+(instancetype)shareStack;

/**
 获取文件位置
 
 @return 文件位置
 */
-(NSURL*)getDocumentUrlPath;

/**
 CoreData 增
 
 @param dict 需要新增模型的键值
 @param success 成功
 @param fail 失败
 */
-(void)inserNewEntity:(NSDictionary*)dict newObjectForEntityForName:(NSString*)entityForName success:(void(^)(NSManagedObject*))success fail:(void(^)(NSError*))fail;



/**
 CoreData 删
 
 @param object 需要删除的实体
 @param success 成功
 @param fail 失败
 */
-(void)delectEntity:(NSArray<NSManagedObject*>*)object success:(void(^)(void))success fail:(void(^)(NSError*))fail;



/**
 CoreData 查
 
 @param selectKeys 数组高级排序（数组里存放实体中的key，顺序按自己需要的先后存放即可），实体key来排序
 @param isAscending 升降序
 @param filterString 谓语
 @param success 成功
 @param fail 失败
 */
-(void)selectEntity:(NSArray* __nullable)selectKeys ObjectForEntityForName:(NSString* __nullable)entityForName ascending:(BOOL)isAscending filterString:(NSString* __nullable)filterString success:(void(^)(NSAsynchronousFetchResult*))success fail:(void(^)(NSError*))fail;


/**
 CoreData 更新
 
 @param success 成功
 @param fail 失败
 */
-(void)updateEntity:(void(^)(void))success fail:(void(^)(NSError*))fail;



@end

NS_ASSUME_NONNULL_END
